<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>停用词与短语查询 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords-phrases.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords-phrases.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/stopwords-phrases.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/stopwords-phrases.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="languages.html">处理人类语言</a></span>
»
<span class="breadcrumb-link"><a href="stopwords.html">停用词: 性能与精度</a></span>
»
<span class="breadcrumb-node">停用词与短语查询</span>
</div>
<div class="navheader">
<span class="prev">
<a href="common-terms.html">« 高低频词: 分而治之</a>
</span>
<span class="next">
<a href="common-grams.html">common_grams 过滤器 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="stopwords-phrases"></a>停用词与短语查询(Phrase Queries)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/50_Phrase_queries.asciidoc">edit</a>
</h2>
</div></div></div>
<p>所有查询中, 短语查询(见<a class="xref" href="phrase-matching.html" title="短语匹配">短语匹配</a>) 大约占到5%，但是在慢查询里面它们又占大部分。
短语查询性能相对较差，特别是当短语中包括常用词的时候，如 <code class="word">“To be, or not to be”</code> 短语全部由停用词组成，这是一种极端情况。原因在于几乎需要匹配全量的数据。</p>
<p>在 <a class="xref" href="pros-cons-stopwords.html" title="停用词的优缺点">停用词的两面-停用词的优缺点</a>,中，我们提到移除停用词只能节省倒排索引中的一小部分空间。这句话只部分正确，一个典型的索引可能包含部分或所有以下数据：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
词项字典（Terms dictionary）
</span>
</dt>
<dd>
索引中所有文档内所有词项的有序列表，以及包含该词的文档数量。
</dd>
<dt>
<span class="term">
倒排表（Postings list）
</span>
</dt>
<dd>
包含每个词项的文档（ID）列表。
</dd>
<dt>
<span class="term">
词频（Term frequency）
</span>
</dt>
<dd>
每个词项在每个文档里出现的频率。
</dd>
<dt>
<span class="term">
位置（Positions）
</span>
</dt>
<dd>
每个词项在每个文档里出现的位置，供短语查询或近似查询使用。
</dd>
<dt>
<span class="term">
偏移（Offsets）
</span>
</dt>
<dd>
每个词项在每个文档里开始与结束字符的偏移，供词语高亮使用，默认是禁用的。
</dd>
<dt>
<span class="term">
归一化因子（Norms）
</span>
</dt>
<dd>
用来对字段长度进行规范化处理的因子，给较短字段予以更多权重。
</dd>
</dl>
</div>
<p>将停用词从索引中移除会节省 <em>词项字典</em> 和 <em>倒排表</em> 里的少量空间，但 <em>位置</em> 和 <em>偏移</em> 是另一码事。<em>位置</em>和<em>偏移</em>数据很容易变成索引大小的两倍、三倍、甚至四倍。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_位置信息"></a>位置信息<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/50_Phrase_queries.asciidoc">edit</a>
</h3>
</div></div></div>
<p><code class="literal">analyzed</code> 字符串字段的位置信息默认是开启的， 所以短语查询能随时使用到它。
词项出现的越频繁，用来存储它位置信息的空间就越多。在一个大的文档集合中，对于那些非常常见的词，它们的位置信息可能占用成百上千兆的空间。</p>
<p>运行一个针对高频词 <code class="word">the</code> 的短语查询可能会导致从磁盘读取好几G的数据。这些数据会被存储到内核文件系统的缓存中，以提高后续访问的速度，这看似是件好事，但这可能会导致其他数据从缓存中被剔除，进一步使后续查询变慢。</p>
<p>这显然是我们需要解决的问题。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="index-options"></a>索引选项<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/50_Phrase_queries.asciidoc">edit</a>
</h3>
</div></div></div>
<p>我们首先应该问自己：是否真的需要使用短语查询或 近似查询？</p>
<p>答案通常是：不需要。在很多应用场景下，比如说日志，我们需要知道一个词 <em>是否</em> 在文档中（这个信息由倒排表提供）而不是关心词的位置在哪里。或许我们要对一两个字段使用短语查询，但是我们完全可以在其他 <code class="literal">analyzed</code> 字符串字段上禁用位置信息。</p>
<p><code class="literal">index_options</code> 参数  允许我们控制索引里为每个字段存储的信息。 可选值如下:</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">docs</code>
</span>
</dt>
<dd>
只存储文档及其包含词项的信息。这对 <code class="literal">not_analyzed</code> 字符串字段是默认的。
</dd>
<dt>
<span class="term">
<code class="literal">freqs</code>
</span>
</dt>
<dd>
存储 <code class="literal">docs</code> 信息，以及每个词在每个文档里出现的频次。词频是完成<a class="xref" href="relevance-intro.html" title="什么是相关性?">TF/IDF</a> 相关度计算的必要条件，但如果只想知道一个文档是否包含某个特定词项，则无需使用它。
</dd>
<dt>
<span class="term">
<code class="literal">positions</code>
</span>
</dt>
<dd>
存储 <code class="literal">docs</code> 、 <code class="literal">freqs</code> 、 <code class="literal">analyzed</code> ，以及每个词项在每个文档里出现的位置。 这对 <code class="literal">analyzed</code> 字符串字段是默认的，但当不需使用短语或近似匹配时，可以将其禁用。
</dd>
<dt>
<span class="term">
<code class="literal">offsets</code>
</span>
</dt>
<dd>
存储 <code class="literal">docs</code>,<code class="literal">freqs</code>,<code class="literal">positions</code>, 以及每个词在原始字符串中开始与结束字符的偏移信息( <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-highlighting.html#postings-highlighter" class="ulink" target="_top"><code class="literal">postings</code> highlighter</a> )。这个信息被用以高亮搜索结果，但它默认是禁用的。
</dd>
</dl>
</div>
<p>我们可以在索引创建的时候为字段设置 <code class="literal">index_options</code> 选项，或者在使用  <code class="literal">put-mapping</code> API新增字段映射的时候设置。我们无法修改已有字段的这个设置：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">PUT /my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "title": { <a id="CO174-3"></a><i class="conum" data-value="1"></i>
          "type":          "string"
       },
        "content": { <a id="CO174-4"></a><i class="conum" data-value="2"></i>
          "type":          "string",
          "index_options": "freqs"
      }
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO174-1"><i class="conum" data-value="1"></i></a><a href="#CO174-3"></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">title</code> 字段使用默认的 <code class="literal">positions</code> 设置，所以它适于短语或近似查询。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO174-2"><i class="conum" data-value="2"></i></a><a href="#CO174-4"></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">content</code> 字段的位置设置是禁用的，所以它无法用于短语或近似查询。</p>
</td>
</tr>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_停用词"></a>停用词<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/50_Phrase_queries.asciidoc">edit</a>
</h3>
</div></div></div>
<p>删除停用词是能显著降低位置信息所占空间的一种方式。    一个被删除停用词的索引仍然可以使用短语查询，因为剩下的词的原始位置仍然被保存着，这正如 <a class="xref" href="using-stopwords.html#maintaining-positions" title="保持位置（Maintaining Positions）">保持词元在原内容中的位置（Maintaining Positions）</a> 中看到的那样。 尽管如此，将词项从索引中排除终究会降低搜索能力，这使我们难以区分  <code class="word">Man in the moon</code> 与  <code class="word">Man on the moon</code> 这两个短语。</p>
<p>幸运的是，鱼与熊掌是可以兼得的：请查看 <a class="xref" href="common-grams.html" title="common_grams 过滤器"><code class="literal">common_grams</code> 过滤器</a>。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="common-terms.html">« 高低频词: 分而治之</a>
</span>
<span class="next">
<a href="common-grams.html">common_grams 过滤器 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>